using dnAnalytics.Math;
using NUnit.Framework;

namespace dnAnalytics.Tests.Math
{
    [TestFixture]
    public class ComplexMath_LogTest
    {
        [Test]
        public void Log()
        {
            TestHelper.TestSignificantDigits(ComplexMath.Log(new Complex(0.0, 1.19209289550780998537e-7)), new Complex(-1.5942385152878744226e1, 1.57079632679489661923), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Log(new Complex(0.0, -1.19209289550780998537e-7)), new Complex(-1.5942385152878744226e1, -1.57079632679489661923), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Log(new Complex(0.0, 5.0e-1)), new Complex(-6.93147180559945309417e-1, 1.57079632679489661923), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Log(new Complex(0.0, -5.0e-1)), new Complex(-6.93147180559945309417e-1, -1.57079632679489661923), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Log(new Complex(0.0, 1.0)), new Complex(0.0, 1.57079632679489661923), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Log(new Complex(0.0, -1.0)), new Complex(0.0, -1.57079632679489661923), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Log(new Complex(0.0, 2.0)), new Complex(6.93147180559945309417e-1, 1.57079632679489661923), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Log(new Complex(0.0, -2.0)), new Complex(6.93147180559945309417e-1, -1.57079632679489661923), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Log(new Complex(0.0, 8.388608e6)), new Complex(1.59423851528787421166e1, 1.57079632679489661923), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Log(new Complex(0.0, -8.388608e6)), new Complex(1.59423851528787421166e1, -1.57079632679489661923), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Log(new Complex(1.19209289550780998537e-7, 0.0)), new Complex(-1.5942385152878744226e1, 0.0), 13);
//            TestHelper.TestLogRelativeError(ComplexMath.Log(new Complex(-1.19209289550780998537e-7, 0.0)), new Complex(-1.5942385152878744226e1, 3.14159265358979323846), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Log(new Complex(1.19209289550780998537e-7, 1.19209289550780998537e-7)), new Complex(-1.55958115625987715713e1, 7.85398163397448309616e-1), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Log(new Complex(1.19209289550780998537e-7, -1.19209289550780998537e-7)), new Complex(-1.55958115625987715713e1, -7.85398163397448309616e-1), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Log(new Complex(-1.19209289550780998537e-7, 1.19209289550780998537e-7)), new Complex(-1.55958115625987715713e1, 2.35619449019234492885), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Log(new Complex(-1.19209289550780998537e-7, -1.19209289550780998537e-7)), new Complex(-1.55958115625987715713e1, -2.35619449019234492885), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Log(new Complex(1.19209289550780998537e-7, 5.0e-1)), new Complex(-6.93147180559916887708e-1, 1.57079608837631751767), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Log(new Complex(1.19209289550780998537e-7, -5.0e-1)), new Complex(-6.93147180559916887708e-1, -1.57079608837631751767), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Log(new Complex(-1.19209289550780998537e-7, 5.0e-1)), new Complex(-6.93147180559916887708e-1, 1.57079656521347572079), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Log(new Complex(-1.19209289550780998537e-7, -5.0e-1)), new Complex(-6.93147180559916887708e-1, -1.57079656521347572079), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Log(new Complex(1.19209289550780998537e-7, 1.0)), new Complex(7.1054273576009213949e-15, 1.57079620758560706845), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Log(new Complex(1.19209289550780998537e-7, -1.0)), new Complex(7.1054273576009213949e-15, -1.57079620758560706845), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Log(new Complex(-1.19209289550780998537e-7, 1.0)), new Complex(7.1054273576009213949e-15, 1.57079644600418617001), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Log(new Complex(-1.19209289550780998537e-7, -1.0)), new Complex(7.1054273576009213949e-15, -1.57079644600418617001), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Log(new Complex(1.19209289550780998537e-7, 2.0)), new Complex(6.93147180559947085774e-1, 1.57079626719025184384), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Log(new Complex(1.19209289550780998537e-7, -2.0)), new Complex(6.93147180559947085774e-1, -1.57079626719025184384), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Log(new Complex(-1.19209289550780998537e-7, 2.0)), new Complex(6.93147180559947085774e-1, 1.57079638639954139462), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Log(new Complex(-1.19209289550780998537e-7, -2.0)), new Complex(6.93147180559947085774e-1, -1.57079638639954139462), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Log(new Complex(1.19209289550780998537e-7, 8.388608e6)), new Complex(1.59423851528787421166e1, 1.57079632679488240838), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Log(new Complex(1.19209289550780998537e-7, -8.388608e6)), new Complex(1.59423851528787421166e1, -1.57079632679488240838), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Log(new Complex(-1.19209289550780998537e-7, 8.388608e6)), new Complex(1.59423851528787421166e1, 1.57079632679491083009), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Log(new Complex(-1.19209289550780998537e-7, -8.388608e6)), new Complex(1.59423851528787421166e1, -1.57079632679491083009), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Log(new Complex(5.0e-1, 0.0)), new Complex(-6.93147180559945309417e-1, 0.0), 13);
//            TestHelper.TestLogRelativeError(ComplexMath.Log(new Complex(-5.0e-1, 0.0)), new Complex(-6.93147180559945309417e-1, 3.14159265358979323846), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Log(new Complex(5.0e-1, 1.19209289550780998537e-7)), new Complex(-6.93147180559916887708e-1, 2.38418579101557479565e-7), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Log(new Complex(5.0e-1, -1.19209289550780998537e-7)), new Complex(-6.93147180559916887708e-1, -2.38418579101557479565e-7), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Log(new Complex(-5.0e-1, 1.19209289550780998537e-7)), new Complex(-6.93147180559916887708e-1, 3.14159241517121413691), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Log(new Complex(-5.0e-1, -1.19209289550780998537e-7)), new Complex(-6.93147180559916887708e-1, -3.14159241517121413691), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Log(new Complex(5.0e-1, 5.0e-1)), new Complex(-3.46573590279972654709e-1, 7.85398163397448309616e-1), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Log(new Complex(5.0e-1, -5.0e-1)), new Complex(-3.46573590279972654709e-1, -7.85398163397448309616e-1), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Log(new Complex(-5.0e-1, 5.0e-1)), new Complex(-3.46573590279972654709e-1, 2.35619449019234492885), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Log(new Complex(-5.0e-1, -5.0e-1)), new Complex(-3.46573590279972654709e-1, -2.35619449019234492885), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Log(new Complex(5.0e-1, 1.0)), new Complex(1.11571775657104877883e-1, 1.10714871779409050302), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Log(new Complex(5.0e-1, -1.0)), new Complex(1.11571775657104877883e-1, -1.10714871779409050302), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Log(new Complex(-5.0e-1, 1.0)), new Complex(1.11571775657104877883e-1, 2.03444393579570273545), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Log(new Complex(-5.0e-1, -1.0)), new Complex(1.11571775657104877883e-1, -2.03444393579570273545), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Log(new Complex(5.0e-1, 2.0)), new Complex(7.23459491468162730708e-1, 1.32581766366803246506), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Log(new Complex(5.0e-1, -2.0)), new Complex(7.23459491468162730708e-1, -1.32581766366803246506), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Log(new Complex(-5.0e-1, 2.0)), new Complex(7.23459491468162730708e-1, 1.8157749899217607734), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Log(new Complex(-5.0e-1, -2.0)), new Complex(7.23459491468162730708e-1, -1.8157749899217607734), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Log(new Complex(5.0e-1, 8.388608e6)), new Complex(1.5942385152878743893e1, 1.57079626719025184384), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Log(new Complex(5.0e-1, -8.388608e6)), new Complex(1.5942385152878743893e1, -1.57079626719025184384), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Log(new Complex(-5.0e-1, 8.388608e6)), new Complex(1.5942385152878743893e1, 1.57079638639954139462), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Log(new Complex(-5.0e-1, -8.388608e6)), new Complex(1.5942385152878743893e1, -1.57079638639954139462), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Log(new Complex(1.0, 0.0)), new Complex(0.0, 0.0), 13);
//            TestHelper.TestLogRelativeError(ComplexMath.Log(new Complex(-1.0, 0.0)), new Complex(0.0, 3.14159265358979323846), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Log(new Complex(1.0, 1.19209289550780998537e-7)), new Complex(7.1054273576009213949e-15, 1.19209289550780433848e-7), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Log(new Complex(1.0, -1.19209289550780998537e-7)), new Complex(7.1054273576009213949e-15, -1.19209289550780433848e-7), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Log(new Complex(-1.0, 1.19209289550780998537e-7)), new Complex(7.1054273576009213949e-15, 3.14159253438050368768), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Log(new Complex(-1.0, -1.19209289550780998537e-7)), new Complex(7.1054273576009213949e-15, -3.14159253438050368768), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Log(new Complex(1.0, 5.0e-1)), new Complex(1.11571775657104877883e-1, 4.63647609000806116214e-1), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Log(new Complex(1.0, -5.0e-1)), new Complex(1.11571775657104877883e-1, -4.63647609000806116214e-1), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Log(new Complex(-1.0, 5.0e-1)), new Complex(1.11571775657104877883e-1, 2.67794504458898712225), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Log(new Complex(-1.0, -5.0e-1)), new Complex(1.11571775657104877883e-1, -2.67794504458898712225), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Log(new Complex(1.0, 1.0)), new Complex(3.46573590279972654709e-1, 7.85398163397448309616e-1), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Log(new Complex(1.0, -1.0)), new Complex(3.46573590279972654709e-1, -7.85398163397448309616e-1), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Log(new Complex(-1.0, 1.0)), new Complex(3.46573590279972654709e-1, 2.35619449019234492885), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Log(new Complex(-1.0, -1.0)), new Complex(3.46573590279972654709e-1, -2.35619449019234492885), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Log(new Complex(1.0, 2.0)), new Complex(8.047189562170501873e-1, 1.10714871779409050302), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Log(new Complex(1.0, -2.0)), new Complex(8.047189562170501873e-1, -1.10714871779409050302), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Log(new Complex(-1.0, 2.0)), new Complex(8.047189562170501873e-1, 2.03444393579570273545), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Log(new Complex(-1.0, -2.0)), new Complex(8.047189562170501873e-1, -2.03444393579570273545), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Log(new Complex(1.0, 8.388608e6)), new Complex(1.5942385152878749222e1, 1.57079620758560706845), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Log(new Complex(1.0, -8.388608e6)), new Complex(1.5942385152878749222e1, -1.57079620758560706845), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Log(new Complex(-1.0, 8.388608e6)), new Complex(1.5942385152878749222e1, 1.57079644600418617001), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Log(new Complex(-1.0, -8.388608e6)), new Complex(1.5942385152878749222e1, -1.57079644600418617001), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Log(new Complex(2.0, 0.0)), new Complex(6.93147180559945309417e-1, 0.0), 13);
//            TestHelper.TestLogRelativeError(ComplexMath.Log(new Complex(-2.0, 0.0)), new Complex(6.93147180559945309417e-1, 3.14159265358979323846), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Log(new Complex(2.0, 1.19209289550780998537e-7)), new Complex(6.93147180559947085774e-1, 5.96046447753904286825e-8), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Log(new Complex(2.0, -1.19209289550780998537e-7)), new Complex(6.93147180559947085774e-1, -5.96046447753904286825e-8), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Log(new Complex(-2.0, 1.19209289550780998537e-7)), new Complex(6.93147180559947085774e-1, 3.14159259398514846307), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Log(new Complex(-2.0, -1.19209289550780998537e-7)), new Complex(6.93147180559947085774e-1, -3.14159259398514846307), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Log(new Complex(2.0, 5.0e-1)), new Complex(7.23459491468162730708e-1, 2.44978663126864154172e-1), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Log(new Complex(2.0, -5.0e-1)), new Complex(7.23459491468162730708e-1, -2.44978663126864154172e-1), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Log(new Complex(-2.0, 5.0e-1)), new Complex(7.23459491468162730708e-1, 2.89661399046292908429), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Log(new Complex(-2.0, -5.0e-1)), new Complex(7.23459491468162730708e-1, -2.89661399046292908429), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Log(new Complex(2.0, 1.0)), new Complex(8.047189562170501873e-1, 4.63647609000806116214e-1), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Log(new Complex(2.0, -1.0)), new Complex(8.047189562170501873e-1, -4.63647609000806116214e-1), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Log(new Complex(-2.0, 1.0)), new Complex(8.047189562170501873e-1, 2.67794504458898712225), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Log(new Complex(-2.0, -1.0)), new Complex(8.047189562170501873e-1, -2.67794504458898712225), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Log(new Complex(2.0, 2.0)), new Complex(1.03972077083991796413, 7.85398163397448309616e-1), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Log(new Complex(2.0, -2.0)), new Complex(1.03972077083991796413, -7.85398163397448309616e-1), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Log(new Complex(-2.0, 2.0)), new Complex(1.03972077083991796413, 2.35619449019234492885), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Log(new Complex(-2.0, -2.0)), new Complex(1.03972077083991796413, -2.35619449019234492885), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Log(new Complex(2.0, 8.388608e6)), new Complex(1.59423851528787705383e1, 1.57079608837631751767), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Log(new Complex(2.0, -8.388608e6)), new Complex(1.59423851528787705383e1, -1.57079608837631751767), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Log(new Complex(-2.0, 8.388608e6)), new Complex(1.59423851528787705383e1, 1.57079656521347572079), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Log(new Complex(-2.0, -8.388608e6)), new Complex(1.59423851528787705383e1, -1.57079656521347572079), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Log(new Complex(8.388608e6, 0.0)), new Complex(1.59423851528787421166e1, 0.0), 13);
//            TestHelper.TestLogRelativeError(ComplexMath.Log(new Complex(-8.388608e6, 0.0)), new Complex(1.59423851528787421166e1, 3.14159265358979323846), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Log(new Complex(8.388608e6, 1.19209289550780998537e-7)), new Complex(1.59423851528787421166e1, 1.42108547152019737407e-14), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Log(new Complex(8.388608e6, -1.19209289550780998537e-7)), new Complex(1.59423851528787421166e1, -1.42108547152019737407e-14), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Log(new Complex(-8.388608e6, 1.19209289550780998537e-7)), new Complex(1.59423851528787421166e1, 3.14159265358977902761), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Log(new Complex(-8.388608e6, -1.19209289550780998537e-7)), new Complex(1.59423851528787421166e1, -3.14159265358977902761), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Log(new Complex(8.388608e6, 5.0e-1)), new Complex(1.5942385152878743893e1, 5.96046447753905544139e-8), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Log(new Complex(8.388608e6, -5.0e-1)), new Complex(1.5942385152878743893e1, -5.96046447753905544139e-8), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Log(new Complex(-8.388608e6, 5.0e-1)), new Complex(1.5942385152878743893e1, 3.14159259398514846307), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Log(new Complex(-8.388608e6, -5.0e-1)), new Complex(1.5942385152878743893e1, -3.14159259398514846307), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Log(new Complex(8.388608e6, 1.0)), new Complex(1.5942385152878749222e1, 1.19209289550780685311e-7), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Log(new Complex(8.388608e6, -1.0)), new Complex(1.5942385152878749222e1, -1.19209289550780685311e-7), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Log(new Complex(-8.388608e6, 1.0)), new Complex(1.5942385152878749222e1, 3.14159253438050368768), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Log(new Complex(-8.388608e6, -1.0)), new Complex(1.5942385152878749222e1, -3.14159253438050368768), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Log(new Complex(8.388608e6, 2.0)), new Complex(1.59423851528787705383e1, 2.38418579101557982491e-7), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Log(new Complex(8.388608e6, -2.0)), new Complex(1.59423851528787705383e1, -2.38418579101557982491e-7), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Log(new Complex(-8.388608e6, 2.0)), new Complex(1.59423851528787705383e1, 3.1415924151712141369), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Log(new Complex(-8.388608e6, -2.0)), new Complex(1.59423851528787705383e1, -3.1415924151712141369), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Log(new Complex(8.388608e6, 8.388608e6)), new Complex(1.62889587431587147713e1, 7.85398163397448309616e-1), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Log(new Complex(8.388608e6, -8.388608e6)), new Complex(1.62889587431587147713e1, -7.85398163397448309616e-1), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Log(new Complex(-8.388608e6, 8.388608e6)), new Complex(1.62889587431587147713e1, 2.35619449019234492885), 13);
            TestHelper.TestSignificantDigits(ComplexMath.Log(new Complex(-8.388608e6, -8.388608e6)), new Complex(1.62889587431587147713e1, -2.35619449019234492885), 13);
        }
    }
}